package design.mode.singleton;


import java.util.concurrent.atomic.AtomicLong;

/**
 * 标准写法：饿汉式
 * Singleton类被称为单例类，通过隐藏构造方法，在内部初始化一次，并提供一个全局的访问点。
 * <p>单例模式在现实生活中的应用非常广泛，例如公司CEO、部门经理等都属于单例模型。
 * J2EE标准中的ServletContext和ServletContextConfig、Spring框架应用中的ApplicationContext、数据库中的连接池等也都是单例模式。对于Java来说，单例模式可以保证在一个JVM中只存在单一实例。
 * 单例模式的应用场景主要有以下几个方面。
 * （1）需要频繁创建的一些类，使用单例可以降低系统的内存压力，减少GC。
 * （2）某些类创建实例时占用资源较多，或实例化耗时较长，且经常使用。
 * （3）频繁访问数据库或文件的对象。
 * （4）对于一些控制硬件级别的操作，或者从系统上来讲应当是单一控制逻辑的操作，如果有多个实例，则系统会完全乱套。<P/>
 */

public class CommonSingleton {

    /*
    饿汉式单例写法在类加载的时候立即初始化，并且创建单例对象。它绝对线程安全，在线程还没出现之前就实例化了，不可能存在访问安全问题。
    */
    private AtomicLong id = new AtomicLong();

    private static final CommonSingleton instance = new CommonSingleton();

    private CommonSingleton() {

    }

    public static CommonSingleton getInstance() {
        return instance;
    }

    public long getId() {
        return id.incrementAndGet();
    }
}
